home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-06-12 | 42.1 KB | 1,417 lines |
- .TITLE K11MCO - Robin's Connect Code
- .IDENT /1.1/
- .ENABL LC
-
- ; Note:
- ;
- ; This code is (currently, 13-Feb-86 13:24:03) selected with the SET
- ; RSX CON ALT command. At some near point in the future it will likely
- ; be default for M+. The older K11CON.MAC will always be used for P/OS.
- ;
- ; As of 28-Feb-86 09:14:26, it is the default for RSX11M/M+ (not P/OS).
- ; As of 05-Mar-86 12:30:29, K11CON is historical, K11PCO is for P/OS.
- ;
- ; Brian Nelson
- ; 13-Feb-86 13:26
- ; 12-Sep-86 13:48:12 BDN Changes for I/D space
- ; 07-Feb-89 00:00:00 Jerry Hudgins
- ; Added buffering to local terminal handling to
- ; prevent high-speed local input from overwriting
- ; outgoing modem QIO buffer.
-
-
-
- .if ndf, K11INC
- .ift
- .include /IN:K11MAC.MAC/
- .endc
-
-
- ;+
- ;
- ; Free software BY
- ; Northern Telecom, Inc.
- ;
- ; This software is furnished for free and may be used and copied as
- ; desired. This software or any other copies thereof may be provided or
- ; otherwise made available to any other person. No title to and
- ; ownership of the software is hereby transferred or allowed.
- ;
- ; The information in this software is subject to change without notice
- ; and should not be construed as a commitment by NORTHERN TELECOM, INC.
- ;
- ; NORTHERN TELECOM assumes no responsibility for the use or reliability
- ; of this software on any equipment whatsoever.
- ;
- ; Northern Telecom, Inc.
- ; Network Support Systems Division
- ; 54 Regional Drive
- ; Concord, New Hampshire 03301
- ; (603) 224-6511 Ext. 2529
- ;
- ;
- ; Title: K11RTM
- ; Author: Robin Miller
- ; Date: January 29, 1986
- ;
- ; Description:
- ;
- ; This module contains the connect code which is used in virtual
- ; terminal mode when talking to a remote system.
- ;
- ;-
-
- .enabl lsb
-
-
- doconn::
- xdorsx::tstb ttname ; insure that a device name is set
- bne 1$ ; ok
- message <You must first define an output port:>,cr ;jfp 840607
- message <Use the SET LINE command for this.>,cr
- return
-
-
- 1$: message <Connecting to line > ; Print the line and speed out
- print #ttname ; the link name
- calls ttspee ,<#ttname> ; get the speed now
- tst r0 ; not if we can't get it
- ble 5$ ; yes, do not print 0 or -1 baud
- message < at > ; and the speed
- sub #10 ,sp ; try to format the response a little
- mov sp ,r1 ; allocate a buffer and point to it
- deccvt r0,r1,#4 ; convert to decimal, 4 wide
- print r1 ,#4 ; print it
- add #10 ,sp ; pop the buffer
- message < baud>,cr ; and finish off the message
- 5$: message < Type CTRL >
- clr -(sp) ; allocate a text buffer
- bisb conesc ,(sp) ; get it
- add #100 ,(sp) ; convert it back to printable
- mov sp ,r0 ; point to it now
- print r0 ,#1 ; at last
- tst (sp)+ ; pop the buffer
- message < and then C to return to command level>,cr
- call altrsx ; /44/
-
-
- 100$: return
-
- .dsabl lsb
-
- global <conesc ,getsys ,ttcons ,ttname ,lun.co ,lun.ti>
-
-
- .enabl gbl
- .NLIST BEX
-
- .MCALL ALUN$S, ASTX$S, CLEF$S, CMKT$S, DIR$, DSAR$S, DSCP$S
- .MCALL ENAR$S, ENCP$S, EXIT$S, MRKT$S, QIOW$, QIOW$S, QIO$
- .MCALL QIO$S, SETF$S, SREX$S, TTSYM$, WTSE$S
-
-
- TTSYM$ ; Define terminal symbols.
-
- global <conesc, getsys, ttcons, ttname, lun.co, lun.ti>
-
- .SBTTL Definitions
-
- ; Event flags:
-
- ef.rem = 14. ; Remote event flag.
- ef.loc = 15. ; Local event flag.
- ef.kill = 16. ; Kill I/O event flag.
- ef.time = 17. ; Mark time event flag.
- ef.wait = 18. ; Main wait event flag.
- ef.sync = 19. ; Synchronize event flag.
-
- ; Marktime equates:
-
- TICKS = 1 ; Ticks.
- SECNDS = 2 ; Seconds.
- MINUTE = 3 ; Minutes.
- HOURS = 4 ; Hours.
-
- ; ASCII Equates.
-
- XON = 17. ; Transmission on (CTRL/Q).
- XOFF = 19. ; Transmission off (CTRL/S).
-
- ; Remote terminal equates.
-
- BUFSIZ = 512. ; Size of transmission buffers.
- COMCHR = 32. ; Size of each remote buffer.
- COMTIM = 6. ; Max time for buffer fill (ticks).
- COMNBF = <BUFSIZ/COMCHR> ; Number of remote buffers.
- COMQNM = 4 ; Number of reads to queue.
- COMCTS = <COMCHR*3> ; Number of bytes before XOFF.
- COMSIZ = <COMNBF*COMCHR> ; Size of main remote buffer.
-
- ; Local terminal equates.
-
- TTYCHR = 64. ; Maximum local bytes to write.
- LOCSIZ =: 64. ; /60/ size of circular local input
- ; ; /60/ buffer, bytes
-
- .SBTTL FILTBL - Terminal Fill Table.
- ;
- ; This table defines the amount of time to wait for a remote
- ; buffer to fill. Since this time is speed dependent, the speed
- ; selected is used to index this table and set the fill time.
- ;
- ; Note: The time here will actually be multiplied by the
- ; number of active remote reads which speed dependant.
- ;
-
- .psect $PDATA ,D
-
- FILTBL: .BYTE 12. ; S.0
- .BYTE 12. ; S.50
- .BYTE 12. ; S.75
- .BYTE 12. ; S.100
- .BYTE 12. ; S.110
- .BYTE 10. ; S.134
- .BYTE 10. ; S.150
- .BYTE 10. ; S.200
- .BYTE 10. ; S.300
- .BYTE 8. ; S.600
- .BYTE 8. ; S.1200
- .BYTE 8. ; S.1800
- .BYTE 6. ; S.2000
- .BYTE 6. ; S.2400
- .BYTE 6. ; S.3600
- .BYTE 6. ; S.4800
- .BYTE 6. ; S.7200
- .BYTE 6. ; S.9600
- .BYTE 6. ; S.EXTA
- .BYTE 6. ; S.EXTB
- .BYTE 4. ; S.19.2
- .BYTE 4. ; S.38.4
- .EVEN
-
- .SBTTL CHRTBL - Character Read Table.
- ;
- ; This table is used to set the maximum number of characters
- ; per remote read QIO. At slower speeds, the size is reduced
- ; since it takes too much time to fill each read buffer. The
- ; affect of this is smoother output to the local terminal since
- ; input and output are taking place at the same time.
- ;
- CHRTBL: .WORD COMCHR/8. ; S.0
- .WORD COMCHR/8. ; S.50
- .WORD COMCHR/8. ; S.75
- .WORD COMCHR/6 ; S.100
- .WORD COMCHR/6 ; S.110
- .WORD COMCHR/4 ; S.134
- .WORD COMCHR/4 ; S.150
- .WORD COMCHR/3 ; S.200
- .WORD COMCHR/3 ; S.300
- .WORD COMCHR/2 ; S.600
- .WORD COMCHR/2 ; S.1200
- .WORD COMCHR/2 ; S.1800
- .WORD COMCHR ; S.2000
- .WORD COMCHR ; S.2400
- .WORD COMCHR ; S.3600
- .WORD COMCHR ; S.4800
- .WORD COMCHR ; S.7200
- .WORD COMCHR ; S.9600
- .WORD COMCHR ; S.EXTA
- .WORD COMCHR ; S.EXTB
- .WORD COMCHR ; S.19.2
- .WORD COMCHR ; S.38.4
-
- .SBTTL QUETBL - Queue Reads Table.
- ;
- ; This table is used to set the number of reads to queue to the
- ; remote whenever input arrives. At high speeds, a large number
- ; of reads must be queued or else input is lost. At slow speeds
- ; this number can be less so we reduce the number of reads queued
- ; to minimumize overhead.
- ;
- QUETBL: .BYTE COMQNM-2. ; S.0
- .BYTE COMQNM-2. ; S.50
- .BYTE COMQNM-2. ; S.75
- .BYTE COMQNM-2 ; S.100
- .BYTE COMQNM-2 ; S.110
- .BYTE COMQNM-2 ; S.134
- .BYTE COMQNM-2 ; S.150
- .BYTE COMQNM-2 ; S.200
- .BYTE COMQNM-2 ; S.300
- .BYTE COMQNM-2 ; S.600
- .BYTE COMQNM-2 ; S.1200
- .BYTE COMQNM-1 ; S.1800
- .BYTE COMQNM-1 ; S.2000
- .BYTE COMQNM-1 ; S.2400
- .BYTE COMQNM-1 ; S.3600
- .BYTE COMQNM ; S.4800
- .BYTE COMQNM ; S.7200
- .BYTE COMQNM ; S.9600
- .BYTE COMQNM ; S.EXTA
- .BYTE COMQNM ; S.EXTB
- .BYTE COMQNM ; S.19.2
- .BYTE COMQNM ; S.38.4
- .EVEN
-
- .SBTTL Local Terminal Characteristics.
-
- .psect RWDATA ,D,RW,LCL,REL,CON
-
- ; Local terminal characteristics to save.
-
- TTYSV: .BYTE TC.ACR,0 ; {No} Wrap-around.
- .BYTE TC.BIN,0 ; {No} Read-passall.
- .BYTE TC.FDX,0 ; {No} Full-duplex.
- .BYTE TC.HLD,0 ; {No} Hold screen.
- .BYTE TC.NEC,0 ; {No} Echo.
- .BYTE TC.RAT,0 ; {No} Typeahead.
- .BYTE TC.SCP,0 ; {No} Scope.
- .BYTE TC.SMR,0 ; {No} Lowercase.
- .BYTE TC.SLV,0 ; {No} Slave.
- .BYTE TC.TTP ; Terminal type.
- TTYPE: .BYTE T.V100 ; Default terminal type.
- TTYSVL = .-TTYSV
-
- ; Local characteristics to fix at startup time.
-
- FIXCH: .BYTE TC.BIN,0 ; No Read-passall.
- .BYTE TC.NEC,0 ; Echo.
- FIXCHL=.-FIXCH
-
- ; Local characteristics to change.
-
- TTYCH: .BYTE TC.ACR,0 ; No Wrap-around.
- .BYTE TC.BIN,1 ; Read-passall.
- .BYTE TC.FDX,1 ; Full-duplex.
- .BYTE TC.HLD,0 ; No Hold screen.
- .BYTE TC.NEC,1 ; No Echo.
- .BYTE TC.RAT,1 ; Typeahead.
- .BYTE TC.SCP,1 ; Scope.
- .BYTE TC.SMR,1 ; Lowercase.
- TTYCHL = .-TTYCH
-
- .SBTTL Remote Terminal Characteristics.
-
- ; Remote terminal characteristics to save.
-
- COMSV: .BYTE TC.ACR,0 ; {No} Wrap-around.
- .BYTE TC.BIN,0 ; {No} Read-passall.
- .BYTE TC.FDX,0 ; {No} Full-duplex.
- .BYTE TC.HLD,0 ; {No} Hold screen.
- .BYTE TC.NEC,0 ; {No} Echo.
- .BYTE TC.NBR,0 ; {No} Broadcast.
- .BYTE TC.RAT,0 ; {No} Typeahead.
- .BYTE TC.SCP,0 ; {No} Scope.
- .BYTE TC.SMR,0 ; {No} Lowercase.
- .BYTE TC.SLV,0 ; {No} Slave.
- .byte TC.PTH,0 ; /60/ {no} pasthru
- .byte TC.8BC,0 ; /60/ {no} EBC
- .byte TC.HHT,0 ; /60/ {no} hardware tab
- .byte TC.HFF,0 ; /60/ {no} hardware FF
- .byte TC.HFL,0 ; /60/ {no} horizontal fill
- .byte TC.VFL,0 ; /60/ {no} vertical fill
- .byte TC.ESQ,0 ; /60/ {no} ESC sequence recognition
- .BYTE TC.TBS,0 ; Typeahead buffer size.
- COMSVL = .-COMSV
-
- ; Remote characteristics to save for modems.
-
- COMDSV: .BYTE TC.ABD,0 ; {No} Autobaud.
- .BYTE TC.WID,0 ; Terminal width.
- .BYTE TC.DLU,0 ; {No} Remote.
- RMODEM == .-1 ; The remote modem flag <> 0 = True.
- COMDSL = .-COMDSV
-
- ; Remote terminal characteristics to change.
-
- COMCH: .BYTE TC.ACR,0 ; No Wrap-around.
- .BYTE TC.BIN,1 ; Read-Passall.
- .BYTE TC.FDX,1 ; Full-duplex.
- .BYTE TC.HLD,0 ; No Hold-screen.
- .BYTE TC.NEC,1 ; No Echo.
- .BYTE TC.NBR,1 ; No Broadcast.
- .BYTE TC.RAT,1 ; Typeahead.
- .BYTE TC.SCP,1 ; Scope.
- .BYTE TC.SMR,1 ; Lowercase.
- .BYTE TC.SLV,1 ; Slave.
- .byte TC.PTH,1 ; /60/ pasthru
- .byte TC.8BC,1 ; /60/ EBC
- .byte TC.HHT,1 ; /60/ hardware tab
- .byte TC.HFF,1 ; /60/ hardware FF
- .byte TC.HFL,0 ; /60/ no horizontal fill
- .byte TC.VFL,0 ; /60/ no vertical fill
- .byte TC.ESQ,0 ; /60/ no escape sequence recognition
- .BYTE TC.TBS,255. ; Typeahead buffer size.
- COMCHL = .-COMCH
-
- ; Remote characteristics to change for modems.
-
- COMDCH: .BYTE TC.ABD,0 ; No Autobaud.
- .BYTE TC.WID,255. ; Terminal width.
- .BYTE TC.DLU,0 ; {No} Remote.
- SMODEM == .-1 ; The remote modem location to change.
- COMDCL = .-COMDCH
-
- ; Ensure we are saving all changed remote characteristics.
-
- .IF NE <COMSVL-COMCHL>
- .ERROR ; Remote save and change characteristics length different.
- .ENDC
-
-
- ; Clear the remote typeahead buffer.
-
- COMCLR: .BYTE TC.TBF,0 ; Clear the typeahead buffer.
- COMCLN = .-COMCLR
-
- ; Save the remote terminal speed (if possible).
-
- COMSPD: .BYTE TC.RSP,0 ; The receive speed.
- .BYTE TC.XSP,0 ; The transmit speed.
- COMSPL = .-COMSPD ; Length of speed params.
-
- .SBTTL Data/Buffer Area.
-
- BUFADR: .WORD 0 ; ENDING BUFFER ADDRESS
- BUFLEN: .WORD 0 ; # OF BYTES TO WRITE
- BUFSRT: .WORD 0 ; START OF BUFFER
- BUFLUN: .WORD 0 ; LUN TO WRITE TO
- BUFEND: .WORD 0 ; END OF BUFFER AREA
-
- ESEEN: .WORD 0 ; Interrupt character seen.
- TTYBUF: .WORD 0 ; Local input buffer.
- locbuf: .blkw <LOCSIZ+1>/2 ; /60/ circular local input write buffer
- locptr: .blkw 1 ; /60/ local input write buffer pointer
-
- COMBUF: .BLKB COMSIZ ; The main remote input buffer.
- COMEND: ; Ending address of main buffer.
-
- SRTCOM: .REPT COMNBF ; Generate remote QIO buffers.
- .BLKW 2 ; The I/O status block.
- .BLKB COMCHR ; The remote buffer area.
- .ENDR
- ENDCOM: ; End of remote QIO buffer area.
- LSTCOM: .WORD SRTCOM ; Pointer to first/next buffer.
-
- ; -=user did CTRL/S, +=buffer ovrflw caused CTRL/S, 0=no CTRL/S
-
- COMCTL: .WORD 0 ; The XON/XOFF control flag.
-
- ; Debug storage area:
-
- MAXBC: .WORD 0 ; Maximum size of read completed.
- MAXCOM: .WORD 0 ; Maximum count of remote buffer.
- COMABO: .WORD 0 ; Reads completed via abort code.
- COMKIL: .WORD 0 ; Marktime I/O kill operations.
- COMFUL: .WORD 0 ; Number of full read completed.
- COMNOT: .WORD 0 ; Remote AST notification count.
- RCHIN: .BLKW 2 ; The remote characters in.
- QIOCNT: .WORD 0 ; Number of remote reads issued.
- MINFRE: .WORD COMNBF ; Minimum number of free buffers.
- PGMXOF: .WORD 0 ; XOFF's sent by the program.
- USRXOF: .WORD 0 ; XOFF's sent by the user.
- PGMXON: .WORD 0 ; XON's sent by the program.
- USRXON: .WORD 0 ; XON's sent by the user.
-
- ; End of debug storage area.
-
- COMFRE: .WORD COMNBF ; Number of free remote buffers.
- COMPTR: .WORD COMBUF ; Pointer to remote input buffer.
- COMCNT: .WORD 0 ; Character count in remote buffer.
- COMMKT: .WORD 0 ; # of MRKT$'s outstanding for remote.
- COMNUM: .WORD COMQNM ; Current number of reads to queue.
- COMQIO: .WORD COMCHR ; Number of characters for remote QIO.
- COMQUE: .WORD COMQNM ; Number of remote reads to queue.
- TTYCNT: .WORD TTYCHR ; Number of characters for local QIO.
- FILTIM: .WORD COMTIM ; Time to wait for buffer to fill.
-
- RIOSB: .BLKW 2 ; The remote I/O status block.
- LIOSB: .BLKW 2 ; The local I/O status block.
- XIOSB: .BLKW 2 ; The transfer I/O status block.
- ERRFLG: .WORD 0 ; Error on remote read QIO$. <> 0 = TRUE
- EXFLG: .WORD 0 ; EXIT TO SYSTEM FLAG <> 0 = TRUE
- INTFLG: .WORD 0 ; INTERRUPT CHARACTER TYPED <> 0 = TRUE
-
-
- ; Directive Parameter Blocks (DPB's).
-
- ASTLOC: QIOW$ IO.ATA,lun.co,ef.loc,,LIOSB,,<TTYAST> ; Local UNSOL/AST attach.
-
- ASTREM: QIOW$ IO.ATA!TF.NOT,lun.ti,ef.rem,,RIOSB,,<COMAST> ; Remote UNSOL/AST.
-
- ATTREM: QIOW$ IO.ATT,lun.ti,ef.rem,,RIOSB ; Attach the remote terminal.
-
- CLRCOM: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,,<COMCLR,COMCLN> ; Clear typeahead.
-
- DETLOC: QIOW$ IO.DET,lun.co,ef.loc ; Detach the local terminal.
-
- DETREM: QIOW$ IO.DET,lun.ti,ef.rem ; Detach the remote terminal.
-
- GETLOC: QIOW$ SF.GMC,lun.co,ef.loc,,LIOSB,,<TTYSV,TTYSVL> ; Get local.
-
- GETREM: QIOW$ SF.GMC,lun.ti,ef.rem,,RIOSB,,<COMSV,COMSVL> ; Get remote.
-
- GETDLU: QIOW$ SF.GMC,lun.ti,ef.rem,,RIOSB,,<COMDSV,COMDSL> ; Get modem.
-
- GETSPD: QIOW$ SF.GMC,lun.ti,ef.rem,,RIOSB,,<COMSPD,COMSPL> ; Get speed.
-
- HANGUP: QIOW$ IO.HNG,lun.ti,ef.rem,,RIOSB ; Hangup remote modem.
-
- KILLOC: QIO$ IO.KIL,lun.co,ef.kill ; Kill local terminal I/O.
-
- KILREM: QIO$ IO.KIL,lun.ti,ef.kill ; Kill remote terminal I/O.
-
- RESLOC: QIOW$ SF.SMC,lun.co,ef.loc,,LIOSB,,<TTYSV,TTYSVL> ; Local restore.
-
- RESREM: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,,<COMSV,COMSVL> ; Remote restore.
-
- RESDLU: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,,<COMDSV,COMDSL> ; Modem restore.
-
- SETLOC: QIOW$ SF.SMC,lun.co,ef.loc,,LIOSB,,<TTYCH,TTYCHL> ; Local changes.
-
- SETREM: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,,<COMCH,COMCHL> ; Remote changes.
-
- SETDLU: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,,<COMDCH,COMDCL> ; Modem changes.
-
- SETSPD: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,,<COMSPD,COMSPL> ; Set speed.
-
- XOFREM: QIO$ IO.WAL!TF.WBT,lun.ti,,,,,<CTRLS,1,0> ; Send XOFF to remote.
-
- XONREM: QIO$ IO.WAL!TF.WBT,lun.ti,,,,,<CTRLQ,1,0> ; Send XON to remote.
-
- rmtout: Qio$ IO.WAL!TF.WBT,lun.ti,,,,,<0,1,0> ; /60/ write to remote port
- ;
- ; ASCII messages.
- ;
- .NLIST BEX
-
- CTRLQ: .ASCII <XON> ; Transmission ON character.
- CTRLS: .ASCII <XOFF> ; Transmission OFF character.
-
- .EVEN
-
- .psect $CODE ,I
-
-
- .SBTTL XDORSX - Mainline Code.
- ;+
- ;
- ; XDORSX - Mainline code.
- ;
- ;-
-
- .psect $CODE ,I
-
- ALTRSX: call getprv ; Enable task privilege.
- clr eseen ; Show escape not yet seen.
- mov #locbuf,locptr ; /60/ init local write buffer ptr
- calls ttpars ,<#ttname> ; Get the remote unit number.
- alun$s #lun.ti,r1,r0 ; Assign LUN to the remote.
- alun$s #lun.co,#"TI,#0 ; Assign our local terminal
- ;
- ; Setup the buffer pointers and associated variables:
- ;
- MOV #COMNBF,COMFRE ; Set all remote buffers free.
- MOV #COMNBF,MINFRE ; Set minimum buffers free.
- MOV #SRTCOM,LSTCOM ; Set pointer to 1st buffer.
- CLR COMCNT ; Clear the buffer count.
- CLR COMCTL ; CLear the XOFF/XON flag.
- MOV #COMBUF,COMPTR ; Reset the buffer pointer.
- CLR EXFLG ; Initialize the exit flag.
- CLR INTFLG ; Reset the interrupt flag.
-
- ; Get the current local terminal characteristics.
-
- DIR$ #GETLOC ; Get local characteristics.
-
- ; Detach the local terminal and re-attach with unsolicited AST input.
-
- DSAR$S ; Disable AST'S for a while.
- DIR$ #DETLOC ; Detach the local terminal.
-
- ; Set up the new local terminal characteristics.
-
- DIR$ #SETLOC ; Setup local characteristics.
- CALL CHKLIO ; Check/report any errors.
- DIR$ #ASTLOC ; Attach local with unsol/AST.
- CALL CHKLIO ; Check/report any errors.
-
- ; Now get the remote characteristics and setup new ones.
-
- DIR$ #GETREM ; Get remote characteristics.
- DIR$ #GETDLU ; Get modem characteristics.
- DIR$ #GETSPD ; Get the remote port speed.
- CLRB SMODEM ; Presume it's not a modem.
- TSTB RMODEM ; Is terminal set for modem ?
- BEQ 50$ ; If EQ, no.
- MOVB #2,SMODEM ; Yes, change value of TC.DLU.
- 50$: DIR$ #SETREM ; Setup remote characteristics.
- DIR$ #SETDLU ; Setup modem characteristics.
- DIR$ #SETSPD ; Set the remote port speed.
- BCS 60$ ; If CS, presume not variable.
-
- ; Set up various parameters based on the remote speed.
-
- MOVB COMSPD+1,R2 ; Copy the remote port speed.
- MOVB FILTBL(R2),FILTIM ; Set time for remote buffer fill.
- MOVB QUETBL(R2),COMQUE ; Set number of reads to queue.
- ASL R2 ; Convert into a word index.
- MOV CHRTBL(R2),COMQIO ; Set maximum remote read count.
-
- 60$: DIR$ #DETREM ; Detach the remote terminal.
- DIR$ #ASTREM ; Reattach with UNSOL/AST'S.
- CALL CHKRIO ; Check/report any errors.
- DIR$ #CLRCOM ; Clear the typeahead buffer.
-
- ENAR$S ; Re-enable AST'S.
- dscp$s ; *** DISABLE CHECKPOINTING ***
- SREX$S #RSXABO ; Setup the abort AST routine.
-
- .SBTTL LOOP - Loop Reading From Terminals.
- ;+
- ;
- ; LOOP - Loop reading from local and remote terminals.
- ;
- ; This is the mainline routine which simply waits for input from the
- ; remote and then controls output to the local terminal. Since all
- ; local and remote input is either done or activated via AST's, we
- ; don't have to post any reads in this routine.
- ;
- ;-
- LOOP: TST COMCTL ; Did the user type XOFF ?
- BMI 50$ ; If MI, yes (wait awhile).
- TST COMCNT ; Anything in main buffer ?
- BEQ 40$ ; If EQ, no.
- DSAR$S ; Yes, disable AST'S.
- CMP COMCNT,MAXCOM ; Need to update max count ?
- BLOS 5$ ; If LOS, no.
- MOV COMCNT,MAXCOM ; Yes, so set new maximum.
- 5$: MOV COMPTR,BUFADR ; Save the buffer pointer.
- MOV TTYCNT,BUFLEN ; Set the local output size.
- MOV COMCNT,R3 ; Copy the main buffer count.
- SUB TTYCNT,R3 ; Adjust the buffer count.
- BHIS 10$ ; If HIS, not too much.
- ADD R3,BUFLEN ; TTYCNT was too many.
- CLR R3 ; Initialize the buffer count.
-
- 10$: MOV R3,COMCNT ; Save new main buffer count.
- SUB R3,BUFADR ; Point to end of this group.
- BCS 20$ ; If CS, rewrap.
- CMP BUFADR,#COMBUF ; Pointed before beginning ?
- BHIS 30$ ; If HIS, no.
- 20$: ADD #COMSIZ,BUFADR ; Point to that much before end.
- 30$: ENAR$S ; Enable AST'S.
- MOV #COMBUF,BUFSRT ; Set the starting address.
- MOV #COMEND,BUFEND ; Set the ending address.
- MOV #lun.co,BUFLUN ; Set the LUN to write to.
- CALL BUFOUT ; Write buffer to device.
-
- 40$: TST COMCTL ; Did the progam send XOFF ?
- BLE 45$ ; If LE, no (user did).
- CMP COMCNT,#COMCTS ; Still near buffer overflow ?
- BHIS 45$ ; If HIS, yes.
- BIC #77777,COMCTL ; Clear the XOFF flag
- DIR$ #XONREM ; Send an XON to the remote.
- INC PGMXON ; Adjust program XON count.
-
- 45$: TST INTFLG ; Was interrupt key typed ?
- BNE 100$ ; If NE, yes.
- TST COMCNT ; Anything else to output ?
- BNE LOOP ; If NE, yes (write more).
-
- ; We simply wait here for something to do.
-
- 50$: WTSE$S #ef.wait ; Wait for something to do.
- CLEF$S #ef.wait ; Clear our wait event flag.
-
- ; If the exit flag is set, go exit the program.
-
- TST EXFLG ; Was exit set via abort AST ?
- BEQ 60$ ; If EQ, no.
- JMP EXISYS ; Yes, so exit to the system.
-
- ; If the interrupt key was typed, request a command.
-
- 60$: TST INTFLG ; Was interrupt key typed ?
- BNE 100$ ; If NE, yes.
- ;
- ; If the remote error was "Device Not Ready" (IE.DNR) then reset
- ; the remote terminal characteristics and speed since the terminal
- ; driver changes certain characteristics when a modem is hungup.
- ;
- TST ERRFLG ; Was there a remote error ?
- BEQ 70$ ; If EQ, no.
- CMPB #IE.DNR,RIOSB ; Was error "Device Not Ready" ?
- BNE 65$ ; If NE, no.
- calls suspend ,<#2,#0> ; Wait for device to be ready.
- DIR$ #SETREM ; Setup remote characteristics.
- DIR$ #SETSPD ; Set the remote port speed.
- 65$: CLR ERRFLG ; Reset the remote error flag.
-
- 70$: JMP LOOP ; Go check for local output.
-
- ; Exit virtual terminal mode.
-
- 100$: CALL CANCEL ; Cancel all outstanding I/O.
- DIR$ #RESLOC ; Reset local characteristics.
- DIR$ #DETLOC ; Detach the local terminal.
- CALL REMRES ; Restore/detach remote port.
- encp$s ; *** ENABLE CHECKPOINTING ***
- call setcc ; Set CTRL/C handler ???
- call drpprv ; Drop task privilege.
- return ; Return from connect mode.
-
- .SBTTL TTYAST - Local Character AST Routine.
- ;+
- ;
- ; TTYAST - Local terminal character AST routine.
- ;
- ; This routine is entered when the user types a character at the local
- ; terminal. If we're in command mode, we check for CTRL/C to set the
- ; abort flag for file transfer commands. Otherwise, we process special
- ; characters such as XON and XOFF, then write the character to the remote.
- ;
- ; Inputs:
- ; (SP) = The local input character.
- ;
- ;-
- TTYAST:
- mov (SP)+,ttybuf ; /60/ fetch the local character
- Save <R0,R1> ; save some registers.
- movb ttybuf,R1 ; /60/ copy byte to R1
- bicb #200,R1 ; /60/ clear possible parity bit.
- movb R1,@locptr ; /60/ save it in the write buffer
-
- ; Check for the local escape character.
-
- cmpb r1,conesc ; /60/ Console escape ?
- bne 10$ ; If NE, no.
- tst eseen ; Already seen one escape ?
- bne 20$ ; If NE, yes (send this one).
- inc eseen ; No, show escape was seen.
- br 90$ ; And exit the routine ...
-
- ; If escape has been seen, process the following character.
-
- 10$: tst eseen ; Character following escape ?
- beq 20$ ; If NE, no (send it).
- call concmd ; Yes, so go process it.
- clr eseen ; Clear the escape seen flag.
- tst r0 ; Should we exit CONNECT mode ?
- beq 20$ ; If EQ, not a valid command.
- blt 90$ ; If LT, it's a valid command.
- MOV #-1,INTFLG ; Else, show interrupt typed.
- DIR$ #KILLOC ; Kill I/O on the local port.
- DIR$ #KILREM ; Kill I/O on the remote port.
- SETF$S #ef.wait ; Wakeup the mainline.
- BR 90$ ; And use common exit.
-
- 20$: clr eseen ; Clear the escape seen flag.
-
- ; Check for special control characters.
-
- 30$: CMPB #XOFF,R1 ; /60/ Was CTRL/S typed ?
- BNE 40$ ; If NE, no.
- BIS #100000,COMCTL ; Yes, show XOFF typed.
- INC USRXOF ; Adjust user XOFF count.
- BR 70$ ; Send it to the remote.
-
- 40$: CMPB #XON,R1 ; /60/ Was CTRL/Q typed ?
- BNE 70$ ; If NE, no.
- BIC #100000,COMCTL ; Yes, clear XOFF flag.
- INC USRXON ; Adjust user XON count.
- SETF$S #ef.wait ; Wakeup mainline to output.
- TST COMCTL ; Did we send an XOFF ?
- BNE 90$ ; If NE, yes (no XON yet).
- ;
- ; If local echo, append this character to the remote buffer
- ; for output via the mainline. The character will also get
- ; written to the logfile using this mechanism.
- ;
- 70$: TSTB duplex ; Need to do a local echo ?
- BEQ 80$ ; If EQ, no.
- SETF$S #ef.wait ; Wakeup mainline to output.
- MOVB R1,@COMPTR ; /60/ Copy character main buffer.
- INC COMPTR ; Adjust the buffer pointer.
- INC COMCNT ; Adjust the buffer count.
- CMP COMPTR,#COMEND ; Are we at end of buffer ?
- BNE 80$ ; If NE, no.
- MOV #COMBUF,COMPTR ; Yes, wrap to beginning.
-
- ; Write the local character to the remote port.
-
- 80$: setpar @locptr,@locptr ; /60/ set correct outgoing parity.
- mov locptr,rmtout+Q.IOPL ; /60/ address of byte in DPB
- Dir$ #rmtout ; /60/ write character to remote port
- BCC 85$ ; /60/ If CC, success.
- CALL CHKDIR ; Else, report the error.
- 85$:
- inc locptr ; /60/ point at next buffer position
- cmp #locbuf+LOCSIZ,locptr ; /60/ time to wrap buffer pointer?
- bne 90$ ; /60/ nope, no yet
- mov #locbuf,locptr ; /60/ yes, point at beginning
- 90$:
- Unsave <R1,R0> ; restore saved registers.
- ASTX$S ; Exit from the AST.
-
- .SBTTL COMAST - Remote Character AST Routine.
- ;+
- ;
- ; COMAST - Remote character AST routine.
- ;
- ; This routine is entered to notify us that characters have arrived
- ; on the remote port. Since this is notification only, characters
- ; arriving are stored in the typeahead buffer until we issue a read.
- ;
- ; Inputs:
- ; (SP) = The AST parameter in our attach QIO.
- ;
- ; Outputs:
- ; All registers are preserved.
- ;
- ;-
- COMAST: TST (SP)+ ; Discard stack parameter.
- TST EXFLG ; Does user want to exit ?
- BNE 100$ ; If NE, yes (discard).
- TST INTFLG ; Exiting the connect code ?
- BNE 100$ ; If NE, yes (discard).
- INC COMNOT ; Count AST notifications.
- MOV R4,-(SP) ; Save R4
- MOV R5,-(SP) ; and R5.
- MOV COMQUE,COMNUM ; Set number of reads to queue.
- ;
- ; If we're queuing up another set of reads, that means characters
- ; are arriving faster than our current reads can complete. When
- ; this happens, we'll send an XOFF to stop the remote output.
- ;
- MOV #COMNBF,R4 ; Set number of free buffers.
- SUB COMQUE,R4 ; Calculate number now free.
- CMP COMFRE,R4 ; Queing another set of reads ?
- BHIS 10$ ; If HIS, no.
- TST COMCTL ; Did we already send XOFF ?
- BNE 10$ ; If NE, yes.
- DIR$ #XOFREM ; Send an XOFF to the remote.
- INC COMCTL ; Show we sent the XOFF.
- INC PGMXOF ; Adjust program XOFF count.
-
- 10$: BR COMARM ; Queue up the remote reads.
- ;
- ; If in command mode, clear the remote typeahead buffer or else
- ; additional notifiation AST's won't be delevered when we return
- ; to the virtual terminal mode.
- ;
- 100$: DIR$ #CLRCOM ; Clear the typeahead buffer.
- ASTX$S ; Exit the AST.
-
- .SBTTL COMARM - Arm The Remote Reads.
- ;+
- ;
- ; COMARM - Arm the remote reads.
- ;
- ; This routine is used to queue the read requests to the remote terminal.
- ; For each read, a marktime is also scheduled. When all marktimes have
- ; expired, this means that little or no data has arrived on the remote
- ; port and all queued reads get killed. The read AST routine will then
- ; copy any characters which have arrived to the main buffer where they
- ; will be output to the local terminal by the mainline routine.
- ;
- ; Note: This routine is called at AST level.
- ;
- ; Inputs:
- ; 2(SP) = The saved R5.
- ; 4(SP) = The saved R4.
- ;
- ; Outputs:
- ; All registers are preserved.
- ;
- ;-
- .ENABL LSB
-
- COMARM: TST ERRFLG ; Was there a remote error ?
- BNE 100$ ; If NE, yes (no QIO's).
- TST COMFRE ; Are all the buffers in use ?
- BLE 100$ ; If LE, yes.
- TST COMNUM ; Already queued enough reads ?
- BLE 100$ ; If LE, yes.
-
- QIOCOM: MOV LSTCOM,R4 ; Set address of next buffer.
- MOV R4,R5 ; Copy starting buffer address.
- ADD #4,R5 ; Point past I/O status block.
- QIO$S #IO.RAL,#lun.ti,,,R4,#REMAST,<R5,COMQIO>
- BCS 90$ ; If CS, the directive failed.
- INC QIOCNT ; Count number of remote QIO's.
- DEC COMFRE ; Adjust the free buffer count.
- CMP COMFRE,MINFRE ; Low water free buffer mark ?
- BHIS 10$ ; If HIS, no.
- MOV COMFRE,MINFRE ; Set new low water buffer mark.
- 10$: DEC COMNUM ; Adjust the reads queued count.
- MRKT$S ,FILTIM,#TICKS,#TIMCOM ; Set the timer for buffer fill.
- BCS 90$ ; If CS, the directive failed.
- INC COMMKT ; Count number of timers queued.
- MOV R4,LSTCOM ; Copy the current buffer address.
- ADD #COMCHR+4,LSTCOM ; Point to the next free buffer.
- CMP LSTCOM,#ENDCOM ; Are we at end of buffer area ?
- BNE 20$ ; If NE, no.
- MOV #SRTCOM,LSTCOM ; Yes, point to starting area.
- 20$: BR COMARM ; Try to arm another read.
-
- 90$: CALL CHKDIR ; Report the directive error.
-
- 100$: MOV (SP)+,R5 ; Restore R4
- MOV (SP)+,R4 ; and R5.
- SETF$S #ef.wait ; Wakeup mainline for output.
- ASTX$S ; And exit the AST.
-
- .DSABL LSB
-
- .SBTTL TIMCOM - Remote Marktime AST Routine.
- ;+
- ;
- ; TIMCOM - Remote Marktime AST routine.
- ;
- ; This routine is entered when the marktime issued after a read to the
- ; remote expires. After all marktimes have expired, the remote I/O is
- ; killed and REMAST is entered with the bytes received from the remote.
- ;
- ;-
- TIMCOM: TST EXFLG ; EXIT FLAG SET ?
- BNE 10$ ; IF NE, YES (KILL I/O)
- TST INTFLG ; Exiting the connect code ?
- BEQ 20$ ; IF EQ, NO (CONTINUE)
- ;
- ; If exiting the connect code or exiting the program, cancel marktimes,
- ; and kill remote I/O so KERMIT commands will not get screwed.
- ;
- 10$: CMKT$S ,#TIMCOM ; Cancel any remote marktimes.
- CLR COMMKT ; Initialize the marktime count.
- BR 30$ ; And kill the remote I/O.
- 20$: DEC COMMKT ; Adjust the marktime count.
- BNE 40$ ; If NE, more timers queued.
- 30$: DIR$ #KILREM ; Else, kill the remote I/O.
- INC COMKIL ; Adjust kill operation count.
- 40$: TST (SP)+ ; Remove event flag number.
- ASTX$S ; And exit the AST.
-
- .SBTTL REMAST - Remote Read AST Routine.
- ;+
- ;
- ; REMAST - Remote read AST completion routine.
- ;
- ; This routine is entered when a remote read completes. Its function
- ; is to copy any characters received to the main buffer, wakeup the
- ; mainline to start output to the local terminal, and to re-issue the
- ; read if there have been no errors and something was read.
- ;
- ; Inputs:
- ; (SP) = The I/O status block address.
- ;
- ; Outputs:
- ; All registers are preserved.
- ;
- ;-
- REMAST: INC COMFRE ; Adjust free buffer count.
- TST EXFLG ; Are we exiting the program ?
- BNE 10$ ; If NE, yes.
- TST INTFLG ; Exiting the connect code ?
- BEQ 20$ ; If EQ, no (continue ...)
- 10$: TST (SP)+ ; Remove status block address.
- ASTX$S ; And exit the AST.
-
- 20$: MOV R4,-(SP) ; Save
- MOV R5,-(SP) ; some
- MOV R1,-(SP) ; registers
- MOV R3,-(SP) ; on the stack.
- MOV COMPTR,R1 ; Copy the buffer pointer.
- MOV COMCNT,R3 ; And the buffer byte count.
- MOV 10(SP),R4 ; Copy status block address.
- MOV R4,R5 ; Copy this address,
- ADD #4,R5 ; and point to the data area.
- TSTB (R4) ; Was there any errors ?
- BPL 50$ ; If PL, no.
- CMPB #IE.ABO,(R4) ; Was the read killed ?
- BNE 40$ ; If NE, no.
- INC COMABO ; Adjust aborted reads count.
- ;
- ; When the reads get killed, only the current outstanding read
- ; has an AST delivered. All other reads which are queued, get
- ; killed, but the specified AST is not delevered. Therefore,
- ; we must set all buffers as free when abort is detected.
- ;
- MOV #COMNBF,COMFRE ; Yes, set all buffers free.
- ;
- ; Sometimes when our read is killed, there is a very large byte
- ; count in the I/O status block. Just another RSX-11M mystery.
- ;
- CMP #COMCHR,2(R4) ; Is byte count too large ?
- BLO 80$ ; If LO, yes (don't use).
- BR 50$ ; Don't report this error.
-
- 40$: MOV (R4),RIOSB ; Copy the I/O error code.
- CALL CRIOSB ; Write the error message.
- MOV #-1,ERRFLG ; Show there was an error.
-
- 50$: MOV 2(R4),R4 ; Copy the byte count.
- BEQ 85$ ; If EQ, nothing was read.
- CMP R4,MAXBC ; Is this the MAX so far ?
- BLO 55$ ; If LO, no.
- MOV R4,MAXBC ; Yes, save for status.
-
- 55$: ADD R4,RCHIN+2 ; Count the characters read.
- ADC RCHIN ; Add in the carry (if any).
- CMP R4,COMQIO ; Is this a full buffer ?
- BNE 60$ ; If NE, no.
- INC COMFUL ; Adjust full buffer count.
-
- 60$: tst con8bit ; Should we pass eight bits ?
- bne 65$ ; If NE, yes.
- bicb #200,(r5) ; No, so clear the high bit.
-
- 65$: MOVB (R5)+,(R1)+ ; Copy bytes to main buffer.
- INC R3 ; Adjust the byte count.
- CMP R1,#COMEND ; At end of main buffer ?
- BNE 70$ ; If NE, no.
- MOV #COMBUF,R1 ; Yes, reset to beginning.
-
- 70$: SOB R4,60$ ; Loop until we're done.
- CMP R3,#COMCTS ; Getting near buffer overflow ?
- BLO 80$ ; If LO, no.
- TST COMCTL ; Did we already send XOFF ?
- BNE 80$ ; If NE, yes.
- DIR$ #XOFREM ; Send as XOFF to the remote.
- INC COMCTL ; Show we sent the XOFF.
- INC PGMXOF ; Adjust program XOFF count.
-
- 80$: MOV 10(SP),R4 ; Copy the status block address.
- MOV R1,COMPTR ; Save the new buffer pointer
- MOV R3,COMCNT ; and the main buffer count.
- TST ERRFLG ; Was there a remote error ?
- BEQ 90$ ; If EQ, no (continue ...)
- CMPB #IE.DNR,(R4) ; Was error "Device Not Ready" ?
- BNE 90$ ; If NE, no (queue next read).
-
- 85$: MOV (SP)+,R3 ; Restore
- MOV (SP)+,R1 ; all
- MOV (SP)+,R5 ; saved
- MOV (SP)+,R4 ; registers.
- TST (SP)+ ; Remove status block address.
- SETF$S #ef.wait ; Wakeup mainline for output.
- ASTX$S ; And exit the AST.
-
- 90$: MOV (SP)+,R3 ; Restore R3
- MOV (SP)+,R1 ; and R1.
- MOV R4,R5 ; Copy the status block address.
- ADD #4,R5 ; Point to the data buffer.
- MOV 2(SP),4(SP) ; Move R4 down on the stack.
- MOV (SP)+,(SP) ; Move R5 down and clean stack.
- JMP QIOCOM ; Now go queue another read.
-
- .SBTTL BUFOUT - Write Buffer to Device.
- ;+
- ;
- ; BUFOUT - Write a buffer to a device.
- ;
- ; Inputs:
- ; BUFADR = The ending address to write.
- ; BUFSRT = The starting buffer address.
- ; BUFEND = The ending buffer address.
- ; BUFLUN = The device LUN to write to.
- ; BUFLEN = The number of bytes to write.
- ;
- ; Outputs:
- ; All registers are preserved.
- ;
- ;-
- BUFOUT: CALL $SAVAL ; Save all registers.
- TST EXFLG ; Is the exit flag set ?
- BNE 20$ ; If NE, yes.
- TST INTFLG ; Exiting the connect code ?
- BNE 20$ ; If NE, yes.
- MOV BUFLUN,R0 ; Copy the LUN to write to.
- MOV BUFADR,R2 ; Copy the ending address.
- SUB BUFLEN,R2 ; Calculate starting address.
- CMP R2,BUFSRT ; Does buffer wrap around ?
- BLT 10$ ; If LT, yes.
-
- ; Write the buffer to the log file and the terminal.
-
- MOV BUFLEN,R3 ; Copy the byte count.
- CALL WRTLOG ; Write it to the logfile,
- QIOW$S #IO.WAL,R0,#ef.sync,,#XIOSB,,<R2,R3,#0> ; & terminal.
- CALL CHKXIO ; Check/report any errors.
- BR 20$ ; Use common return.
-
- ; The buffer wraps around, use two QIO's to write buffer.
-
- 10$: MOV BUFADR,R3 ; Copy the ending address.
- SUB BUFSRT,R3 ; Calculate bytes from start.
- MOV R3,-(SP) ; Save beginning byte count.
- MOV BUFLEN,R3 ; Copy # of bytes to write.
- SUB (SP),R3 ; Minus chars at beginning.
- MOV BUFEND,R2 ; Copy the ending address.
- SUB R3,R2 ; Calculate starting address.
-
- ; Write the buffer to the log file and the terminal.
-
- CALL WRTLOG ; Write it to the logfile,
- QIOW$S #IO.WAL,R0,#ef.sync,,#XIOSB,,<R2,R3,#0> ; & terminal.
- CALL CHKXIO ; Check/report any errors.
- MOV (SP)+,R3 ; Restore beginning byte count.
- BEQ 20$ ; If EQ, nothing to write.
- CMPB XIOSB,#IE.ABO ; Was the first QIO aborted ?
- BEQ 20$ ; If EQ, yes (no 2nd QIO).
- TST EXFLG ; Is the exit flag set ?
- BNE 20$ ; If NE, yes.
- TST INTFLG ; Exiting the connect code ?
- BNE 20$ ; If NE, yes.
-
- ; Write the buffer to the log file and the terminal.
-
- MOV BUFSRT,R2 ; Copy the starting address.
- CALL WRTLOG ; Write it to the logfile,
- QIOW$S #IO.WAL,R0,#ef.sync,,#XIOSB,,<R2,R3,#0> ; & terminal.
- CALL CHKXIO ; Check/report any errors.
-
- 20$: RETURN
-
- .SBTTL CANCEL - Cancel Local and Remote I/O.
- ;+
- ;
- ; CANCEL - Cancel the local and remote I/O.
- ;
- ; Be careful if calling this routine from AST level since outstanding
- ; I/O will cause us to hang since other I/O can't complete.
- ;
- ;-
- CANCEL: DIR$ #KILLOC ; Kill I/O on local port.
- BCS 10$ ; If CS, don't wait.
- WTSE$S #ef.kill ; Wait for the kill I/O.
-
- 10$: DIR$ #KILREM ; Kill I/O on remote port.
- BCS 20$ ; If CS, don't wait.
- WTSE$S #ef.kill ; Wait for the kill I/O.
-
- 20$: RETURN
-
- .SBTTL CHKDIR - CHECK FOR DIRECTIVE ERROR
- .SBTTL CHKLIO - CHECK FOR LOCAL I/O ERROR
- .SBTTL CHKRIO - CHECK FOR REMOTE I/O ERROR
- ;+
- ;
- ; CHKDIR - Check for a directive error.
- ; CHKLIO - Check for local I/O error code.
- ; CHKRIO - Check for remote I/O error code.
- ;
- ; These routines are called to check for QIO errors for both
- ; the local terminal and the remote terminal port.
- ;
- ; Inputs:
- ; $DSW, LIOSB, RIOSB, or XIOSB status blocks.
- ;
- ; Outputs:
- ; C bit clear/set = success/failure.
- ;
- ; All registers are preserved.
- ;
- ;-
- .ENABL LSB
-
- CHKDIR: JSR R2,$SAVVR ; Save R0 - R2.
- BCC 100$ ; If CC, then success.
- MOV $DSW,R0 ; Else, copy the error code.
- BR 20$ ; And use common code.
-
- CHKXIO: BCS CHKDIR ; If CS, directive error.
- JSR R2,$SAVVR ; Save R0 - R2.
- MOVB XIOSB,R0 ; Copy the I/O code.
- BPL 100$ ; If PL, then success.
- BR 10$ ; Else, use common code.
-
- CHKLIO: BCS CHKDIR ; If CS, directive error.
- JSR R2,$SAVVR ; Save R0 - R2.
- MOVB LIOSB,R0 ; Copy the I/O code.
- BPL 100$ ; If PL, then success.
- BR 10$ ; Continue ...
-
- CHKRIO: BCS CHKDIR ; If CS, directive error.
- CRIOSB: JSR R2,$SAVVR ; Save R0 - R2.
- MOVB RIOSB,R0 ; Copy the I/O code.
- BPL 100$ ; If PL, then success.
-
- 10$: CMPB #IE.ABO,R0 ; Was the I/O killed ?
- BEQ 100$ ; If EQ, yes (expected).
-
- 20$: CALL CHKERR ; Check/write error message.
- ; SEC ; Show we've had an error.
- RETURN ; Return status from CHKERR.
-
- 100$: CLC ; Success or non-fatal error.
- RETURN
-
- .DSABL LSB
-
- .SBTTL CHKERR - Check/Write An Error Message.
- ;+
- ;
- ; CHKERR - Check and write an error message.
- ;
- ; Thie routine checks a table for allowable errors and if the error
- ; code isn't found in the table, the error is reported.
- ;
- ; Inputs:
- ; R0 = The error code.
- ;
- ; Outputs:
- ; C bit clear/set = Allowable/Unacceptable Error.
- ;
- ; All registers are preserved.
- ;
- ;-
- CHKERR: mov r5 ,-(sp) ; insure this is saved
- movb r0,r5 ; Copy the error code.
- scan r5 ,#$errlst ; allowable error code ?
- tst r0 ; well
- bne 180$ ; yes, let it through
- neg r5 ; make > 0 for direrr macro
- direrr r5 ; simple
- sec ; failure, exit to command level
- br 190$ ; bye
- 180$: clc ; success, stay in connect code
- 190$: mov (sp)+ ,r5 ; restore old r0 please
- return
-
- .save
- .psect $PDATA ,D
- $errlst:.byte IE.BCC ,IE.DAO ,IE.IES ,IE.NOD ,IE.PES ,IE.VER ,IE.ABO ,0
- .even
- .restore
-
- global <conesc, ttcons, ttname, lun.co, lun.ti>
-
- .SBTTL WRTLOG - Write I/O to a log file.
- ;+
- ;
- ; WRTLOG - Write I/O to a log file.
- ;
- ; This routine is used to write output from the remote system to
- ; a log file (if enabled).
- ;
- ; Inputs:
- ; R2 = The buffer address.
- ; R3 = The buffer byte count.
- ;
- ; Outputs:
- ; All registers are preserved.
- ;
- ;-
- WRTLOG: call $saval ; Save all registers.
- bit #log$co ,trace ; is this enabled ?
- beq 100$ ; no
- bit #log$op ,trace ; is it open
- beq 100$ ; no
-
- 10$: movb (r2)+,r0 ; Copy the next character.
- mov #lun.lo ,r1 ; Set the unit number.
- call putcr0 ; Write it to the log file.
- sob r3,10$ ; Write the next character.
-
- 100$: return
-
-
- global <lun.lo, putcr0, trace, conflow>
-
- .SBTTL REMRES - Restore Remote Characteristics.
- ;+
- ;
- ; REMRES - Restore the remote characteristics.
- ;
- ; Restore the remote characteristics and detach the terminal.
- ;
- ;-
- REMRES: DIR$ #KILREM ; Kill any I/O on remote LUN.
- WTSE$S #ef.kill ; Wait for the kill to complete.
- DIR$ #RESREM ; Yes, reset the characteristics.
- DIR$ #RESDLU ; Reset the modem characteristics.
- DIR$ #DETREM ; Detach the remote terminal.
- 100$: RETURN
-
- .SBTTL RSXABO - Process an ABORT AST.
- ;+
- ;
- ; RSXABO - Process an ABORT AST.
- ;
- ; This routine is called as the result of KERMIT being ABOrted. The
- ; first time we are entered we simply kill all I/O and try to wakeup
- ; the mainline to actually exit the program. We also start a timer
- ; which if it expires, will simply exit the program so we don't hang.
- ; We don't do too much work here because if we stay at AST level, we
- ; prevent other AST's from completing which may hang the program.
- ;
- ;
- ; Inputs:
- ; (SP) = Number of bytes to remove from the stack.
- ; 2(SP) = The reason for being aborted.
- ;
- ;-
- RSXABO: ADD (SP),SP ; Remove abort information.
- SREX$S ; Remove abort AST routine.
- CMKT$S ; Cancel outstanding timers.
- SETF$S #ef.time ; Set the delay event flag.
- DIR$ #KILLOC ; Kill I/O on local port.
- DIR$ #KILREM ; Kill I/O on remote port.
- SETF$S #ef.wait ; Wakeup the mainline.
- MOV #-1,EXFLG ; Tell the mainline to exit.
- MRKT$S ,#5,#SECNDS,#ABOTMO ; Initiate an abort timer.
- ASTX$S ; Exit the AST.
- ;+
- ;
- ; This routine is entered when the marktime issued in the abort AST
- ; routine expires. If this timer expires, this means the mainline
- ; hasn't detected our exit request so we cancel all I/O, reset the
- ; terminal characteristics, and then exit the program.
- ;
- ;-
- ABOTMO: TST (SP)+ ; Remove marktime parameter.
- EXISYS: CALL CANCEL ; Cancel all outstanding I/O.
- DIR$ #RESLOC ; Reset local characteristics.
- CALL REMRES ; Restore/detach remote port.
- DIR$ #HANGUP ; Ensure the modem is hungup.
- EXIT$S ; And exit to the system ...
-
-
- .sbttl concmd terminal emulation escape commands
- .enabl lsb
-
- concmd::save <r1>
- bicb #^C177 ,r1
- scan r1,#200$ ; look for a match here
- tst r0 ; if no match, return 0
- beq 100$ ; ok
- asl r0 ; word offsets
- jsr pc ,@210$(r0) ; dispatch to the correct routine
- tst r0 ; if not set then set to -1
- bne 100$ ; already set
- dec r0 ; set to -1
- 100$: unsave <r1> ; pop r1 and exit
- return
-
-
- .save
- .psect $PDATA ,D
-
- 200$: .byte 'C&137 ,'c!40 ; drop connection ctrl \ C
- .byte 'I&137 ,'i!40 ; init the line
- .byte 'Q&137 ,'q!40 ; quit logging but leave file open
- .byte 'R&137 ,'r!40 ; resume logging if file is open
- .byte 'X&137 ,'X!40 ; control Q and then thats all
- .byte 'B&137 ,'b!40
- .byte '? ,177 ; help, rub for send break
- .byte 'H&137 ,'h!40
- .byte 0
- .even
-
- 210$: .word con.$ ; unknown escape command
- .word con.c ,con.c ; drop connection
- .word con.i ,con.i ; get modems attention
- .word con.q ,con.q ; turn console logging off
- .word con.r ,con.r ; turn it back on please
- .word con.x ,con.x ; send XON
- .word con.br ,con.br ; break
- .word con.hl ,con.br ; print out commands
- .word con.hl ,con.hl ; help
-
- $bell: .byte 'G&37
- $xon: .byte 'Q&37
- $null2: .byte 0,0
- .even
- .restore
- .dsabl lsb
-
-
- con.$: calls binwri ,<#$bell,#1,#lun.co> ; beep at user
- clr r0
- return
-
-
-
- con.c: mov #1 ,r0 ; set flag to exit connect code
- return ; simple
-
-
- con.i: calls ttydtr ,<#ttname> ; try to force DTR up on the line
- clr r0
- return
-
-
- con.q: bic #log$co ,trace ; turn off console logging
- clr r0
- return
-
-
- con.r: bit #log$op ,trace ; if the file is open do it
- beq 100$ ; no
- bis #log$co ,trace ; yes, enable this
- 100$: clr r0
- return
-
-
- con.x: calls binwri ,<#$xon,#1,#lun.ti>; insure a control Q goes down
- calls ttxon ,<#ttname>
- Call getprv ; /60/ restore privs dropped by TTXON
- clr r0
- return
-
-
- con.br: save <r1,r2> ; save scratch registers please
- clr -(sp) ; clear a sf.gmc buffer out
- clr -(sp) ; ditto
- 10$: mov sp ,r2 ; and a pointer to it please
- movb #tc.xsp ,@r2 ; we want the current speed settings
- movb #tc.rsp ,2(r2) ; ditto
- QIOW$S #SF.GMC,#LUN.TI,,,,,<r2,#4>
- movb 1(r2) ,r1 ; save the old speed setting please
- mov sp ,r2 ; reset the buffer address please
- movb #tc.xsp ,(r2)+ ; stuff xmitter change code in
- movb #s.300 ,(r2)+ ; and the desired speed now
- movb #tc.rsp ,(r2)+ ; stuff receiver change code in
- movb #s.300 ,(r2)+ ; and the desired speed now
- mov sp ,r2 ; point back to the buffer now
- QIOW$S #SF.SMC,#LUN.TI,,,,,<r2,#4>
- QIOW$S #IO.WAL,#LUN.TI,,,,,<#$null2,#2>
- mov sp ,r2 ; reset the buffer address please
- movb #tc.xsp ,(r2)+ ; stuff xmitter change code in
- movb r1 ,(r2)+ ; and the old speed now
- movb #tc.rsp ,(r2)+ ; stuff receiver change code in
- movb r1 ,(r2)+ ; and the old speed now
- mov sp ,r2 ; point back to the buffer now
- QIOW$S #SF.SMC,#LUN.TI,,,,,<r2,#4>
- 100$: cmp (sp)+ ,(sp)+ ; pop local buffer and exit
- clr r0 ; no errors are ever returned
- unsave <r2,r1> ; pop local registers and exit
- return ; bye
-
-
-
-
-
-
- con.hl::strlen #htxt
- calls binwri ,<#htxt,r0,#lun.co>
- clr r0
- return
-
- .save
- .psect $PDATA ,D
-
- htxt: .ascii /B Try to send a break to the remote/<cr><lf>
- .ascii /C Connect back to the local Kermit-11/<cr><lf>
- .ascii /I Drop and raise DTR (for RSTS only)/<cr><lf>
- .ascii /Q Quit console logging. See SET LOG/<cr><lf>
- .ascii /R Resume console logging. See SET LOG/<cr><lf>
- .ascii /X Send XON and cancel any active XONs/<cr><lf>
- .asciz /RUBOUT Try to fake a break to the remote/<cr><lf>
- .ascii /? Print this message/<cr><lf>
- .byte 0
- .even
- .restore
-
- .END
-